//
//  HMStatusListViewModel.swift
//  WeiBo14
//
//  Created by HM on 16/3/6.
//  Copyright © 2016年 HM. All rights reserved.
//  专门为首页提供数据的 viewModel

import UIKit
import SDWebImage

class HMStatusListViewModel: NSObject {
    
    // 当前视图模型对应的模型,供首页使用的微博数组
    var statusArray: [HMStatusViewModel]?
    
    // 专门用于加载首页数据的方法
    // finished(是否成功, 本次加载了多少条数据)
    func loadData(isPullUp: Bool, finished: (isSuccess: Bool, count: Int)->()){
        // url
        let url = "https://api.weibo.com/2/statuses/friends_timeline.json"
        
        
        var sinceId: Int64 = 0
        var maxId: Int64 = 0
        
        // 如果是上拉加载,才去设置maxId
        if isPullUp {
            maxId = statusArray?.last?.status?.id ?? 0
            if maxId != 0 {
                maxId--
            }
        }else{
            sinceId = statusArray?.first?.status?.id ?? 0
        }
        
        // 参数
        let parameters = [
            "access_token": HMUserAccountViewModel.sharedAccountViewModel.accessToken!,
            "max_id": "\(maxId)",
            "since_id": "\(sinceId)"
        ]
        
        // 发送请求
        HMNetworkTools.sharedTools.requst(urlString: url, parameters: parameters) { (responseObject, error) -> () in
            if error != nil {
                print("\(error)")
                // 回调请求失败
                finished(isSuccess: false, count: 0)
                return
            }
            print(responseObject)
            
            // 取到微博字典的数据进行遍历字典转模型
            let dicts = responseObject!["statuses"] as! [[String: AnyObject]]
            
            // 初始化一个临时数组
            var tempArray = [HMStatusViewModel]()
            for dict in dicts {
                // 字典转模型
                let status = HMStatus(dict: dict)
                
                // 为了查看数据结构写的代码
//                if status.pic_urls?.count != 0 {
//                    // print("呵呵")
//                }
                
                let viewModel = HMStatusViewModel(status: status)
                
                tempArray.append(viewModel)
            }
            
            print("加载回来\(tempArray.count)条数据")
            
            // 判断如果 statusArray 为nil,是代表是第一次加载,初始化该数据
            if self.statusArray == nil {
                self.statusArray = [HMStatusViewModel]()
            }
        
            
            // 如果是上拉加载,就把数据拼接在数组的后面
            if isPullUp {
                // 赋值
                self.statusArray! = self.statusArray! + tempArray
            }else{
                // 下拉刷新就把数据接接在数组的前面
                self.statusArray! = tempArray + self.statusArray!
            }
            
            // 缓存单张图片
            self.cacheSingleImage(tempArray,finished: finished)
            // 要使用到调度组,要使用其的原因是因为假如返回回来的数据有10条微博都是单张图片,所以我们需要把10张图片都下载完成之后再去通知界面更新
            
            // 先不通知外界数据请求完成,因为需要先在这个地方去把单张图片下载完成之后再通知去更新界面
            // finished(isSuccess: true)
        }
    }
    
    private func cacheSingleImage(viewModels: [HMStatusViewModel],finished: (isSuccess: Bool, count: Int)->()){
        
        // 调度组
        let group = dispatch_group_create()
        let queue = dispatch_get_main_queue()
        // 2. 循环调用下载图片的方法
        
        for viewModel in viewModels {
            // 1. 拿到url?????
            // 先取到原创微博的配图地址
            var urls = viewModel.status?.pic_urls
            // 判断如果地址为nil 或者 urls的count 为0,那么就直接设置取转发微博配图
            if urls == nil || urls!.count == 0 {
                urls = viewModel.status?.retweeted_status?.pic_urls
            }
            
            
            // 判断 urls 是否只有一张图片,如果只有一张图片,就去下载图片
            if urls?.count == 1 {
                guard let urlString = urls?.first?.thumbnail_pic else {
                    continue
                }
                
                // 做入组操作
                dispatch_group_enter(group)
                // 下载图片
                SDWebImageManager.sharedManager().downloadImageWithURL(NSURL(string: urlString), options: [], progress: nil, completed: { (image, error, _, _, url) -> Void in
                    print("下载完成,地址是:\(url.absoluteString)")
                    // 下载完成或者下载失败
                    dispatch_group_leave(group)
                })
            }
        }
        // 3. 图片下完成之后回调给界面让界面去刷新数据
        dispatch_group_notify(group, queue) { () -> Void in
            print("所有单张图片都下载完成")
            finished(isSuccess: true, count: viewModels.count)
        }
    }
}
